#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


//重定向(简易)
//int main()
//{ 
//
//     //close(1);//关闭stdout
   //系统调用打开文件
//   int fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);//w
//   int fd = open("log.txt", O_CREAT | O_WRONLY | O_APPEND, 0666);//a
//
//     close(0);//关闭stdin
//     int fd = open("log.txt", O_RDONLY);//r
//
//     if(fd < 0)
//     {
//        perror("fd");
//        return 1;
//     }
//
//     //printf("hello linux, fd: %d\n", fd);
// 
//     int a, b, c;
//     scanf("%d %d %d", &a, &b, &c);
//     printf("%d %d %d\n", a, b, c);
//     //和语言缓冲区有关
//     fflush(stdout);//打开stdout
//     close(fd);
//
//
//     return 0;
//}

//程序替换与重定向
int main()
{
    // 1. 打开目标文件
    int fd = open("log.txt", O_CREAT | O_WRONLY | O_APPEND, 0666);
    if(fd < 0)
    {
        perror("open");
        return 0;
    }
    // 2. 输出重定向
    dup2(fd, 1);//修改文件描述符中指向内容为fd指向内容

    // 3. exec*替换，不影响重定向
    execl("/usr/bin/ls", "ls", "-al", NULL); // ls -> stdout

    close(fd);
    return 0;
}


//open系统调用
//int main()
//{
//    printf("stdin->%d\n", stdin->_fileno);
//    printf("stdout->%d\n", stdout->_fileno);
//    printf("stderr->%d\n", stderr->_fileno);
//    umask(0);
//    //int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//    int fd0 = open("log0.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
//    int fd1 = open("log1.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
//    int fd2 = open("log2.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
//    int fd3 = open("log3.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
//
//    printf("fd0: %d\n", fd0);
//    printf("fd1: %d\n", fd1);
//    printf("fd2: %d\n", fd2);
//    printf("fd3: %d\n", fd3);
//
//    close(fd0);
//    close(fd1);
//    close(fd2);
//    close(fd3);    
//    return 0;
//}



//#define VERSION1 (1<<0) //1
//#define VERSION2 (1<<1) //2
//#define VERSION3 (1<<2) //4
//#define VERSION4 (1<<3) //8
//#define VERSION5 (1<<4) //16
//
////位图传递：只有一个比特位为1
//void ShowVersion(int flags)
//{
//    if(flags & VERSION1)
//        printf("Version1\n");
//    if(flags & VERSION2)
//        printf("Version2\n");
//    if(flags & VERSION3)
//        printf("Version3\n");
//    if(flags & VERSION4)
//        printf("Version4\n");
//    if(flags & VERSION5)
//        printf("Version5\n");
//}
//
//
//int main()
//{
//    ShowVersion(VERSION1); // 显示版本
//    printf("---------------\n");
//    ShowVersion(VERSION1 | VERSION2);
//    printf("---------------\n");
//    ShowVersion(VERSION1 | VERSION5);
//    printf("---------------\n");
//    ShowVersion(VERSION1 | VERSION2 | VERSION4);
//    printf("---------------\n");
//    ShowVersion(VERSION1 | VERSION2 | VERSION5);
//    printf("---------------\n");
//    ShowVersion(VERSION1 | VERSION2 |VERSION3 | VERSION4|VERSION5);
//}
